#pragma once
// 对zmq消息队列的高层封装（RPC调用）
#include <string>
#include <thread>
#include <functional>
#include <atomic>
#include <mutex>

#include "global.h"
#include <zmq.h>
#include "log.h"

// 定义函数指针类型
typedef void (*ReceCallback)(const char *data, size_t &size);
// using ReceCallback = std::function<void(const char* data, size_t size)>;

class zmqLogic
{
public:
    zmqLogic();
    ~zmqLogic();
    void Initialize(const std::string &ipcPath, int zmqType, bool isServer); // 初始化函数
    bool RegisterRecvCallback(ReceCallback receCallback);                    // 绑定处理函数指针
    bool StartBind();                                                        // 进行绑定（如果是服务方）
    bool StartConnect();                                                     // 进行连接（如果是服务方）
    bool StartWorkCycle();                                                   // 开始接收循环
    int SendMsg(const char *buffer, size_t size);                            // 发送函数
    void StopWork();                                                         // 公外界调用终止接收线程的处理
    void Send(const std::string &str, int flag);                             // 原始发送函数

private:
    void DealFunc();              // 处理函数
    std::string m_ipcPath;        // 存储监听的ipc文件地址
    bool m_isServer;              // 标志自己是否是服务方
    std::atomic<bool> m_stopFlag; // 是否停止线程处理

    int m_zmqType;                 // 对象的类型（宏）
    void *m_context;               // 保存上下文对象
    void *m_socket;                // 保存自己的套接字对象
    ReceCallback m_receCallback;   // 接收函数指针
    std::thread m_workThread;      // 循环接收的线程
    std::atomic<bool> m_connected; // 添加连接状态标志
    std::mutex m_sendMutex;        // 确保只有一个线程在发送
};
